﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

using RZD_maps.Infrastructure;
using Microsoft.Practices.Prism.Events;
using System.Diagnostics;

using System.Windows.Controls;

using RZD_maps.Modules.Console.Models;
using RZD_maps.Modules.Console.Views;


namespace RZD_maps.Modules.Console.ViewModels
{
    public class ViewModel
    {
        public View View { get; set; }
        private IEventAggregator eventAggregator;
        private SubscriptionToken subscriptionToken;
        private SubscriptionToken subscriptionTokenStation;
        private SubscriptionToken subscriptionTokenTrain;

        private Model model;

        public ViewModel()
        {
            model = new Model();
            model.viewModel = this;
        }

        public ViewModel(IEventAggregator eventAggregator) : this()
        {
            this.eventAggregator = eventAggregator;
            SubscriptCommands();
        }

        public void SubscriptCommands()
        {
            ControlDataEvent evnt = eventAggregator.GetEvent<ControlDataEvent>();
            MapPositionItemEvent evntStation = eventAggregator.GetEvent<MapPositionItemEvent>();
            TrainPositionEvent evntTrain = eventAggregator.GetEvent<TrainPositionEvent>();
            if (subscriptionToken != null)
            {
                evnt.Unsubscribe(subscriptionToken);
            }

            if (subscriptionTokenStation != null)
            {
                evnt.Unsubscribe(subscriptionTokenStation);
            }

            if (subscriptionTokenTrain != null)
            {
                evnt.Unsubscribe(subscriptionTokenTrain);
            }

            subscriptionToken = evnt.Subscribe(ControlDataEventHandler, ThreadOption.UIThread, false, ControlDataFilter);
            subscriptionTokenStation = evntStation.Subscribe(MapPositionItemEventHandler, ThreadOption.UIThread, false, MapPositionItemFilter);
            subscriptionTokenTrain = evntTrain.Subscribe(TrainEventHandler, ThreadOption.UIThread, false, TrainEventFilter);
        }


        public TextBlock GetTextControl()
        {
            return View.txtBlock;
        }

        public void TrainEventHandler(TrainPosition data)
        {
            foreach (var item in data.list)
            {
                model.AddLog(String.Format("Объект с id={0} находится в {1} (широта), {2} (долгота)", item.id, item.lat, item.lng));
            }
        }

        public bool TrainEventFilter(TrainPosition data)
        {
            return true;
        }

        public void ControlDataEventHandler(ControlDataItem controlDataItem)
        {
            switch (controlDataItem.command)
            {
                case ControlDataCommandEnum.bing:
                    model.AddLog("Установлен провайдер карт Bing");
                    break;
                case ControlDataCommandEnum.osm:
                    model.AddLog("Установлен провайдер карт OSM");
                    break;
                case ControlDataCommandEnum.line:
                    model.AddLog("Установлен провайдер карт OSM");
                    break;
                case ControlDataCommandEnum.markers:
                    model.AddLog("Изменено отображение слоя маркеров");
                    break;
                case ControlDataCommandEnum.plain:
                    model.AddLog("Установлен провайдер карт plain");
                    break;
                case ControlDataCommandEnum.scale10:
                    model.AddLog("Установлен масштаб карты 10");
                    break;
                case ControlDataCommandEnum.scale100:
                    model.AddLog("Установлен масштаб карты 100");
                    break;
                case ControlDataCommandEnum.station:
                    model.AddLog("Изменено отображение слоя станций");
                    break;
                case ControlDataCommandEnum.vehicle:
                    model.AddLog("Изменено отображение слоя транспорта");
                    break;
                case ControlDataCommandEnum.gr1:
                    model.AddLog("Команда на отображение графика 1");
                    break;
                case ControlDataCommandEnum.gr2:
                    model.AddLog("Команда на отображение графика 2");
                    break;
                case ControlDataCommandEnum.gr3:
                    model.AddLog("Команда на отображение графика 3");
                    break;
            }
        }

        public bool ControlDataFilter(ControlDataItem controlData)
        {
            return true;
        }

        public void MapPositionItemEventHandler(MapPositionItem mapPositionItem)
        {
            model.AddLog(String.Format("Центр карты установлен в {0} (широта), {1} (долгота)", mapPositionItem.lat, mapPositionItem.lng));
        }

        public bool MapPositionItemFilter(MapPositionItem controlData)
        {
            return true;
        }

    }
}
